gl renderer: Implement cairo nodes again
authorTimm Bäder <mail@baedert.org>
Thu, 23 Nov 2017 09:02:58 +0000 (10:02 +0100)
committerTimm Bäder <mail@baedert.org>
Thu, 21 Dec 2017 18:12:30 +0000 (19:12 +0100)
gsk/gl/gskglrenderer.c

index 9dba95876825b9b71d139b3cab337307ab7330aa..5028273434d8bef160f13139a7cd0ced37a7d19b 100644 (file)
@@ -682,6 +682,32 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
       }
     break;
 
+    case GSK_CAIRO_NODE:
+      {
+        const cairo_surface_t *surface = gsk_cairo_node_peek_surface (node);
+        int gl_min_filter = GL_NEAREST, gl_mag_filter = GL_NEAREST;
+        int texture_id;
+
+        if (surface == NULL)
+          return;
+
+        get_gl_scaling_filters (node, &gl_min_filter, &gl_mag_filter);
+
+        texture_id = gsk_gl_driver_create_texture (self->gl_driver,
+                                                   max_x - min_x,
+                                                   max_y - min_y);
+        gsk_gl_driver_bind_source_texture (self->gl_driver, texture_id);
+        gsk_gl_driver_init_texture_with_surface (self->gl_driver,
+                                                 texture_id,
+                                                 (cairo_surface_t *)surface,
+                                                 gl_min_filter,
+                                                 gl_mag_filter);
+        ops_set_program (builder, &self->blit_program);
+        ops_set_texture (builder, texture_id);
+        ops_draw (builder, vertex_data);
+      }
+    break;
+
     case GSK_TRANSFORM_NODE:
       {
         GskRenderNode *child = gsk_transform_node_get_child (node);
@@ -936,7 +962,6 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
     case GSK_CROSS_FADE_NODE:
     case GSK_BLEND_NODE:
     case GSK_REPEAT_NODE:
-    case GSK_CAIRO_NODE:
     case GSK_COLOR_MATRIX_NODE:
     default:
       {